/**
 *	@file	fld_trhouse_ol.c
 *	@brief	トレーナーハウス フィールド非常駐
 *
 *	@author	Miyuki Iwasawa
 *	@date	09.03.26
 *
 *	このソースは特別にトレーナーハウスセーブデータの全構造体メンバを公開します
 *	ここで公開していても、他のソースに不用意に公開は禁止
 */
#include "common.h"

#include "fieldsys.h"

#include "system/mystatus.h"
#include "poketool/poke_tool.h"

#include "field_subproc.h"
#include "field/field.h"
#include "field/situation_local.h"
#include "field/script.h"
#include "field/syswork.h"
#include "field/fld_bgm.h"
#include "field/union_beacon_tool.h"
#include "fieldmap.h"
#include "map_attr.h"
#include "zonedata.h"
#include "map_tool.h"
#include "scr_tool.h"
#include "scr_msg.h"
#include "scrcmd_def.h"
#include "sysflag.h"
#include "field_subproc.h"
#include "ev_mapchange.h"
#include "field_battle.h"
#include "fld_enceff_data.h"
#include "field_encount.h"
#include "battle/battle_common.h"
#include "battle/attr_def.h"
#include "battle/tr_ai_def.h"

#include "savedata/tr_house.h"
#include "savedata/tr_house_data.h"	//include許可制

#include "msgdata/msg.naix"
#include "msgdata/msg_tr_house.h"

#include "fld_trhouse.h"

#include "poketool/monsno.h"
#include "itemtool/itemsym.h"
#include "battle/wazano_def.h"
#include "battle/tokusyu_def.h"
#include "field/fieldobj_code.h"
#include "system/pms_word.h"
#include "system/pms_word_gmm.h"
#include "tr_house/tr_house_data.dat"


static BATTLE_PARAM* house_CreateBattleParam( FIELDSYS_WORK* fsys,TR_HOUSE_TRAINER* tp);
static void player_TrainerDataMake(TR_HOUSE_PLAYER* src,TRAINER_DATA* dest);
static void sub_SetTrainerData(BATTLE_PARAM* bp,TR_HOUSE_TRAINER* tp,u8 client);

/**
 *	@brief	トレーナーハウスバトル呼び出しインターフェース
 */
void EventCmd_TrHouseBattle(FIELDSYS_WORK* fsys,u16 id)
{
	BATTLE_PARAM *param;
	TR_HOUSE_SAVE* th_sv = SaveData_GetTrHouseSave(fsys->savedata);
//	EventCmd_TowerLocalBattle(fsys->event,NULL,
//			GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WIN_FLAG ));

	//バトルデータ初期化
	if(id == TR_HOUSE_HIKARU_ID){	//ヒカル
		TRAINER_DATA* td;
		param = house_CreateBattleParam(fsys,(TR_HOUSE_TRAINER*)&DATA_TrHouseTrainerHikaru);

		//勝ち負けメッセージ上書き設定
		td = &(param->trainer_data[CLIENT_NO_ENEMY]);
		PMSDAT_SetupDefaultMessage( &td->win_word, &DATA_HikaruDefWordTbl[TR_HOUSE_PMSG_WIN]);
		PMSDAT_SetupDefaultMessage( &td->lose_word, &DATA_HikaruDefWordTbl[TR_HOUSE_PMSG_LOSE]);
	}else{
		param = house_CreateBattleParam(fsys,&th_sv->trainer[id]);
	}
	//一応クリア
	fsys->btower_wk = NULL;

	//呼び出し＆イベント登録(バトルタワーと共有)
	EventCmd_TowerLocalBattleCall(fsys->event,param,
			FLD_EncEffSpDataEffectNoPackGet( param ),
			FLD_EncEffSpDataBgmNoPackGet( param ),
			GetEvScriptWorkMemberAdrs( fsys, ID_EVSCR_WIN_FLAG ));
}

/*
 *	@brief	トレーナーハウスエンカウントメッセージ表示
 */
BOOL EvCmdTrHouseTalkAppearMsg(VM_MACHINE* core)
{
	u16 id = VMGetWorkValue(core);
	TR_HOUSE_SAVE* th_sv = SaveData_GetTrHouseSave(core->fsys->savedata);
	u16 msg[4];

	if(id == TR_HOUSE_HIKARU_ID){	//ヒカル
		PMS_DATA pms;
		PMSDAT_SetupDefaultMessage(&pms, &DATA_HikaruDefWordTbl[TR_HOUSE_PMSG_READY]);
		MI_CpuCopy16(&pms,msg,8);
	}else{
		MI_CpuCopy16(&th_sv->trainer[id].player.word[TR_HOUSE_PMSG_READY],msg,8);
	}
	TalkMsgPMSParam(core,msg[0],msg[1],msg[2],msg[3],1);
	VM_SetWait( core, TalkMsgWait );

	return 1;
}

//--------------------------------------------------------------
/**
 * @brief	トレーナーハウス用　バトルパラメータ生成
 *
 * @param	wk			BTOWER_SCRWORK型のポインタ
 * @param	ex_param	FRONTIER_EX_PARAM型のポインタ
 */
//--------------------------------------------------------------
static BATTLE_PARAM* house_CreateBattleParam( FIELDSYS_WORK* fsys,TR_HOUSE_TRAINER* tp)
{
	int i;
	u8	val8;
	u32	val32;
	BATTLE_PARAM *bp;
	SAVEDATA* sv;
	POKEPARTY* party;

	bp = BattleParam_Create(HEAPID_WORLD,FIGHT_TYPE_BATTLE_TR_HOUSE);

	sv = fsys->savedata;
	party = SaveData_GetTemotiPokemon(sv);

	BattleParam_SetParamByGameDataCore(bp,fsys,sv,
		fsys->location->zone_id,fsys->bag_cursor,fsys->battle_cursor);

	bp->bg_id = BG_ID_ROOM_A;			//基本背景指定
	bp->ground_id = GROUND_ID_FLOOR;	//基本地面指定

	//ポケモンデータセット

	{	//手持ちポケモンをセット
		POKEMON_PARAM* pp = PokemonParam_AllocWork(HEAPID_WORLD);
		int num = PokeParty_GetPokeCount(party);

		PokeParty_Init(bp->poke_party[POKEPARTY_MINE],TR_HOUSE_POKE_MAX);
		for(i = 0;i < num;i++){
			PokeCopyPPtoPP(PokeParty_GetMemberPointer(party,i),pp);

			//レベル調整
			if(PokeParaGet(pp,ID_PARA_level,NULL) > 50){
				val32 = PokeLevelExpGet(PokeParaGet(pp,ID_PARA_monsno,NULL),50);

				PokeParaPut(pp,ID_PARA_exp,&val32);
				PokeParaCalc(pp);
			}
			BattleParam_AddPokemon(bp,pp,POKEPARTY_MINE);
		}
		sys_FreeMemoryEz(pp);
	}
	//トレーナーデータ生成（自分側）
	BattleParam_TrainerDataMake(bp);

	//トレーナーデータ(enemy1)をセット
	sub_SetTrainerData(bp,tp,CLIENT_NO_ENEMY);
//	BattleTowerTrainerDataMake(bp,&(wk->tr_data[0]),wk->member_num,CLIENT_NO_ENEMY,wk->heapID);

	//AIセット
	for( i=0; i < CLIENT_MAX ;i++ ){
		bp->trainer_data[i].aibit = (AI_THINK_BIT_BASIC | AI_THINK_BIT_ATTACK | AI_THINK_BIT_EXPERT);
	}
	return bp;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	ハウス用ポケモンデータからPOKEMON_PARAMを生成
 */
//-----------------------------------------------------------------------------
static void poke_PokeParaMake(const TR_HOUSE_POKEMON* src,POKEMON_PARAM* pp)
{
	int i;
	u8	buf8,waza_pp;
	u16	buf16;
	u32	buf32;

	PokeParaInit(pp);

	//monsno,level,pow_rnd,idno
	if(src->level > 50){
		buf8 = 50;
	}else{
		buf8 = src->level;
	}
	PokeParaSetPowRnd(pp,src->mons_no,buf8,(src->power_rnd & 0x3FFFFFFF),src->personal_rnd);

	//form_no
	buf8 = src->form_no;
	PokeParaPut(pp,ID_PARA_form_no,&buf8);

	//装備アイテム設定
	PokeParaPut(pp,ID_PARA_item,&src->item_no);

	//技設定
	for(i = 0;i < 4;i++){
		buf16 = src->waza[i];
		PokeParaPut(pp,ID_PARA_waza1+i,&buf16);
		buf8 = (src->pp_count >> (i*2))&0x03;
		PokeParaPut(pp,ID_PARA_pp_count1+i,&buf8);

		//pp再設定
		waza_pp = (u8)PokeParaGet(pp,ID_PARA_pp_max1+i,NULL);
		PokeParaPut(pp,ID_PARA_pp1+i,&waza_pp);
	}

	//ID設定
	buf32 = src->id_no;
	PokeParaPut(pp,ID_PARA_id_no,&buf32);

	//経験値設定
	for(i = 0;i < 6;i++){
		buf8 = src->exp[i];
		PokeParaPut(pp,ID_PARA_hp_exp+i,&buf8);
	}

	//特性設定
	PokeParaPut(pp,ID_PARA_speabino,&src->tokusei);

	//なつきど設定
	PokeParaPut(pp,ID_PARA_friend,&src->natuki);

	{
		/*
			ニックネーム
			セーブバッファがMONS_NAME_SIZEきっちり分しかいので、
			EOM付きバッファにいったん展開してからPokeParaにセットする
		*/
		STRCODE name[MONS_NAME_SIZE+EOM_SIZE];
		PM_strclearEOM_(name,MONS_NAME_SIZE+EOM_SIZE);
		PM_strncpy(name,src->nickname,MONS_NAME_SIZE);

		PokeParaPut(pp,ID_PARA_nickname,name);
	}

	//カントリーコード
	PokeParaPut(pp,ID_PARA_country_code,&src->country_code);
	//パラメータ再計算
	PokeParaCalc(pp);
}

/**
 *	@brief	ハウス　トレーナーデータ生成
 */
static void player_TrainerDataMake(TR_HOUSE_PLAYER* src,TRAINER_DATA* dest)
{
	MI_CpuClear8(dest,sizeof(TRAINER_DATA));

	dest->tr_type = UnionView_GetTrainerInfo( src->tr_sex, src->obj_code, UNIONVIEW_TRTYPE);
	dest->tr_gra = 0;	//指定しなくていい
	dest->aibit = 0xFFFFFFFF;	//最強

	//トレーナー名
	PM_strcpy(dest->name,src->name);

	//勝ち負けメッセージ
	PMSDAT_Copy( &dest->win_word, &src->word[TR_HOUSE_PMSG_WIN]);
	PMSDAT_Copy( &dest->lose_word, &src->word[TR_HOUSE_PMSG_LOSE]);

	dest->fight_type = FIGHT_TYPE_1vs1;
}

/**
 *	@brief	トレーナー対戦データ生成
 */
static void sub_SetTrainerData(BATTLE_PARAM* bp,TR_HOUSE_TRAINER* tp,u8 client)
{
	int i;
	POKEMON_PARAM *pp;

	//トレーナーデータをセット
	player_TrainerDataMake(&(tp->player),&(bp->trainer_data[client]));

	//トレーナーID入力
	bp->trainer_id[client] = tp->player.tr_id;

	//対戦相手のポケモンデータをセット
	pp = PokemonParam_AllocWork(HEAPID_WORLD);

	PokeParty_Init(bp->poke_party[client],TR_HOUSE_POKE_MAX);
	for(i = 0;i < TR_HOUSE_POKE_MAX;i++){
		if(tp->poke[i].mons_no == 0){
			break;
		}
		poke_PokeParaMake(&(tp->poke[i]),pp);
		BattleParam_AddPokemon(bp,pp,client);
	}
	sys_FreeMemoryEz(pp);
}

